package com.linhz.demo10.WaitAndNotify;


/**
 * note
 * 包子铺线程和包子线程关系-->通信（互斥）
 * 必须同时同步技术保证两个线程只能有一个在执行
 * 锁对象必须保证唯一，可以使用包子对象作为锁对象
 * 包子铺类和吃货的类就需要把包子对象作为参数传递进来
 * 1、需要在成员位置创建一个包子变量
 * 2、使用带参数构造方法，为这个包子变量赋值
 */
public class BaoZiPu extends Thread{
    private BaoZi bz;
    int count = 0;
    public BaoZiPu(BaoZi bz) {
        this.bz = bz;
    }

    @Override
    public void run() {
        // 让包子铺一直生产包子
        while (true){
            synchronized (bz){
                if(bz.flag == true){
                    try {
                        bz.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                //被唤醒之后执行，包子铺生产包子
                if(count%2 == 0){
                    //生产 薄皮
                    bz.pi = "薄皮";
                    bz.xian = "三鲜馅";
                }else {
                    bz.pi = "冰皮";
                    bz.xian = "大葱馅";
                }
                count++;
                System.out.println("包子铺正在生产："+bz.pi+bz.xian+"包子");
                try{
                    Thread.sleep(3000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                bz.flag = true;
                bz.notify();
                System.out.println("包子铺已经生产好了"+bz.pi+bz.xian+"包子，吃货可以开始吃了");
            }
        }

    }
}
